﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data;

namespace Bibilioteca.DataAccess
{
    public class CatalogosDao : DaoBase
    {
        public int paramID;
        public string nombre;

        public CatalogosDao()
        {
            reiniciarParams();
        }

        /*
         * Establece los valores iniciales para los parametros.
         */
        private void reiniciarParams()
        {
            paramID = -1;
            nombre = "";
        }

        /*
         * Retorna un DataTable con todos los catalogos y todos los campos
         * asociados a ellos.
         */
        public DataTable todosLosCatalogos()
        {
            string sql = "SELECT * FROM catalogos";
            return EjecutarQuery(sql);
        }


        /*
		 * Dado un numero de catalogo, lo retorna.
		 */
        public DataTable GetCatalogoNumero()
        {
            string sql = "SELECT * FROM catalogos where catalogo_id = @numero";
            DataTable retorno = EjecutarQuery(sql, new DbParameter[] { new DbParameter("numero", SqlDbType.VarChar, paramID) });
            reiniciarParams(); //Reinicio los parametros para una proxima consulta.
            return retorno;
        }

        public DataTable catalogoDeMaterial(string materialId)
        {
            string sql = "SELECT * FROM catalogos a join materiales m on a.catalogo_id=m.material_catalogo_id where m.material_id = @numero";
            return EjecutarQuery(sql, new DbParameter[] { new DbParameter("numero", SqlDbType.VarChar, materialId) });
        }


        /*
         * Busca los catalogos segun filtros generados.
         * Modo puede ser modoConsultaOr o modoConsultaAnd.
         * modoUpdate o modoInsert no se usan aca.
         */
        public DataTable GetCatalogoFiltros(int modo)
        {
            string separador = " or "; //Consulta por defecto tipo OR.
            if (modo == 0) separador = " or ";
            else if (modo == 1) separador = " and ";

            string sql = "SELECT * FROM catalogos where ";

            bool primerParam = true; //Soy el primer parametro? sino me debe anteceder un AND o un OR

            LinkedList<DbParameter> parametrosList = new LinkedList<DbParameter>();

            if (paramID != -1)
            {
                if (!primerParam) sql += separador;
                else primerParam = false;
                sql += " catalogo_id = @catalogo_id ";
                parametrosList.AddLast(new DbParameter("catalogo_id", SqlDbType.Int, paramID));
            }

            if (nombre.Length > 1)
            {
                if (!primerParam) sql += separador;
                else primerParam = false;
                sql += " catalogo_nombre like '%' + @catalogo_nombre ";
                parametrosList.AddLast(new DbParameter("catalogo_nombre", SqlDbType.VarChar, nombre));
            }

            sql += "; ";

            DbParameter[] parametros1 = new DbParameter[parametrosList.Count];
            for (int i = 0; i < parametrosList.Count; i++)
            {
                parametros1[i] = parametrosList.ElementAt(i);
            }

            DataTable retorno = new DataTable();

            if (parametrosList.Count > 0)
                retorno = EjecutarQuery(sql, parametros1);

            reiniciarParams(); //Reinicio los parametros para una proxima consulta.
            return retorno;
        }


        public void insertarCatalogo()
        {
            LinkedList<DbParameter> parametrosList = new LinkedList<DbParameter>();

            string sql = "INSERT INTO catalogos ( ";
            string sqlParametros = "";

            if (nombre.Length > 1)
            {
                sql += " catalogo_nombre "; sqlParametros += " @catalogo_nombre";
                parametrosList.AddLast(new DbParameter("catalogo_nombre", SqlDbType.VarChar, nombre));
            }

            sql += ") VALUES ( " + sqlParametros + ")";

            DbParameter[] parametros1 = new DbParameter[parametrosList.Count];
            for (int i = 0; i < parametrosList.Count; i++)
            {
                parametros1[i] = parametrosList.ElementAt(i);
            }

            EjecutarUpdate(sql, parametros1);

            reiniciarParams(); //Reinicio los parametros para una proxima consulta.
        }


        public void modificarCatalogo()
        {
            LinkedList<DbParameter> parametrosList = new LinkedList<DbParameter>();

            bool primerParam = true;

            string sql = "UPDATE catalogos SET ";
            if (nombre.Length > 1)
            {
                if (!primerParam) sql += " , ";
                else primerParam = false;
                sql += "catalogo_nombre = @catalogo_nombre";
                parametrosList.AddLast(new DbParameter("catalogo_nombre", SqlDbType.VarChar, nombre));
            }

            sql += " WHERE catalogo_id = @catalogo_id";

            parametrosList.AddLast(new DbParameter("catalogo_id", SqlDbType.Int, paramID));

            DbParameter[] parametros1 = new DbParameter[parametrosList.Count];
            for (int i = 0; i < parametrosList.Count; i++)
            {
                parametros1[i] = parametrosList.ElementAt(i);
            }

            EjecutarUpdate(sql, parametros1);
            reiniciarParams(); //Reinicio los parametros para una proxima consulta.
        }


        public void eliminarCatalogo()
        {
            if (paramID != -1)
            {
                string sql = "DELETE FROM catalogos where catalogo_id = @numero";
                EjecutarUpdate(sql, new DbParameter[] { new DbParameter("numero", SqlDbType.VarChar, paramID) });
                reiniciarParams();
            }

        }

    }
}